// 接口Interface 描述对象的形状 对类进行抽象 Duck Typing
interface Person {
  // 只读属性
  readonly id: number;
  name: string;
  age: number;
  // ?表示可选属性
  gender?: string;
}

// 变量和接口形状一致 多一个属性少一个属性都会报错
let XD: Person = {
  id: 1,
  name: 'XD',
  age: 20,
  gender: 'female'
}
// XD.id = 2 重新赋值报错

/**
 * 类只能单继承 接口可以多继承 提高面向对象的灵活性
 */
interface Power {
  switchPower(): void
}
interface Battery {
  notifyBattery(): void
}
// 接口可以继承自接口
interface BatteryWithPower extends Power {
  autoPowerOff(): void
}
class Phone implements Power, Battery{
  type: string
  constructor(type = '手机') {
    this.type = type
  }
  switchPower() {
    console.log(`打开${this.type}电源`)
  }
  notifyBattery() {
    console.log(`${this.type}电量不足`)
  }
}
class TV implements Power{
  type: string
  constructor(type = '电视机') {
    this.type = type
  }
  switchPower() {
    console.log(`打开${this.type}电源`)
  }
}
class Radio implements Battery{
  type: string
  constructor(type = '收音机') {
    this.type = type
  }
  switchPower() {
    console.log(`打开${this.type}电源`)
  }
  notifyBattery() {
    console.log(`${this.type}电量不足`)
  }
}

const tv = new TV()
const radio = new Radio()
const phone = new Phone()
tv.switchPower()
radio.switchPower()
phone.notifyBattery()
radio.notifyBattery()